Hellforge General Crackme I
by LaZaRuS
Tutorial de Lucifer48 [Immortal Descendants]
(14 ao√t 1999)
La bonne combinaison de touches est: ALT GR + D
Go, go, go...
Je remplis mon nom et un serial j'appuie sur le boutton
(bpx hmemcpy, comme d'habitude).
XXXX:00401759 CALL 0041F074 ;on sort d'ici
XXXX:0040175E LEA EAX,[EBP-04]
XXXX:00401761 CALL 00445784 ;taille du nom
XXXX:00401766 CMP EAX,04 ;5 caractΦres minimum
XXXX:00401769 LEA EAX,[EBP-04]
XXXX:0040176C SETG DL
XXXX:0040176F AND EDX,01
XXXX:00401772 PUSH EDX
...
XXXX:00401780 POP ECX
XXXX:00401781 TEST CL,CL
XXXX:00401783 JZ 00401E90 ;no jump = taille du nom OK
Plus loin:
XXXX:004017C4 LEA EDX,[EBP-0C] ;dword ptr [edx] = 0
XXXX:004017C7 POP EAX ;dword ptr [eax] = notre serial
XXXX:004017C8 CALL 0044576C ;y'a t-il un serial d'entrΘ ?
XXXX:004017CD PUSH EAX ;eax=1 ou eax=0
...
XXXX:004017EE POP ECX
XXXX:004017EF TEST CL,CL
XXXX:004017F1 JZ 00401E49 ;no jump = un serial est dans l'edit box
Maintenant commence les calculs...
XXXX:0040182B MOVSX ECX,BYTE PTR [EAX] ;lit le premier caractΦre du nom
XXXX:0040182E MOV EAX,ECX
XXXX:00401830 MOV EDX,00000002
XXXX:00401835 SHL EAX,04
XXXX:00401838 ADD EAX,ECX
XXXX:0040183A ADD EAX,0000004D2 ;+1234
XXXX:0040183F MOV [EBP-00A0],EAX
Pour mon nom j'obtiens:
4Ch*10h + 4Ch + 4D2h = 4C0h + 4Ch + 4D2h = 9DEh
XXXX:00401884 MOVSX ECX,BYTE PTR [EAX] ;lit le quatriΦme caractΦre du nom
XXXX:00401887 MOV EAX,ECX
XXXX:00401889 SHL EAX,02
XXXX:0040188C LEA EAX,[EAX*2+EAX] ;3*eax
XXXX:0040188F ADD [EBP-00A0],EAX
Pour mon nom j'obtiens:
69h*4*3 = 69h*Ch = 4ECh
[EBP-00A0] = 4ECh + 9DEh = ECAh
C'est maintenant qu'on arrive au tricky moment:
XXXX:004018F0 MOV EDX,[EAX+000001FC]
XXXX:004018F6 CMP ECX,EDX
XXXX:004018F8 JZ 00401D4E ;jump = mauvais chemin
Je me suis demandΘ pourquoi j'avais tout le temps ecx=ecx, je sentais bien qu'il ne fallait pas
jumper pour rΘsoudre le crackme. J'ai donc eu l'idΘe de modifier mon serial et lα, τa a marchΘ,
j'en ai donc conclu que pour rΘsoudre le crackme, il ne faut pas appuyer/cliquer sur le boutton
"Check Serial", c'est une voie de garage. Et donc on peut continuer; on arrive α une boucle:
XXXX:004019F9 MOV ECX,[EBP-00A4]
XXXX:004019FF CMP ECX,000003E8 ;1000
XXXX:00401A05 JL 00401966
Cette (grosse) boucle ne sert α rien... Voila les vrais calculs.
XXXX:00401A3F MOVSX ECX,BYTE PTR [EAX] ;lit le premier caractΦre du nom
XXXX:00401A42 MOV EAX,ECX
XXXX:00401A44 MOV EDX,00000002
XXXX:00401A49 SHL EAX,02
XXXX:00401A4C LEA EAX,[EAX*2+EAX] ;3*eax
XXXX:00401A4F ADD EAX,00003039 ;12345
XXXX:00401A54 MOV [EBP-00A0],EAX ;MOV et pas ADD (nos calculs prΘcΘdents sont donc inutiles)
...
XXXX:00401A99 MOVSX ECX,BYTE PTR [EAX] ;lit le quatriΦme caractΦre du nom
XXXX:00401A9C MOV EAX,ECX
XXXX:00401A9E SHL EAX,03
XXXX:00401AA1 SUB EAX,ECX
XXXX:00401AA3 LEA EAX,[EAX*2+EAX] ;3*eax
XXXX:00401AA6 ADD [EBP-00A0],EAX
...
XXXX:00401ABC MOV ECX,[EBP-00A0]
XXXX:00401AC2 IMUL ECX,[EBP-00A0]
XXXX:00401AC9 MOV [EBP-00A0],ECX
...
XXXX:00401AFE IMUL EAX,[EBP-00A0] ;eax: taille du nom
XXXX:00401B05 MOV [EBP-00A0],EAX
Soient X1 et X4 le premier et quatriΦme caractΦre du nom, voilα la formule
magique:
( ( ( 0Ch*X1 + 3039h ) + (15h*X4) )^2 )* taille-du-nom
Pour mon nom, j'obtient (X1=4C et X4=69):
0Ch * 4Ch + 3039h = 33C9h
15h * 69h = 89Dh
et (33C9h + 89Dh)^2 * 9 = 3C66h^2 * 9 = 803FBDC4h
On approche de la fin:
XXXX:00401B3E MOV EDX,[EBP-00A0]
XXXX:00401B44 CALL 00445614 ;conversion signΘe α la wsprintf
...
XXXX:00401B7E LEA EAX,[EBP-38] ;notre serial...
XXXX:00401B81 POP EDX ;le bon serial
XXXX:00401B82 CALL 00445754 ;comparaison
XXXX:00401B87 PUSH EAX
...
XXXX:00401BC8 POP ECX
XXXX:00401BC9 TEST CL,CL ;si cl=0: mauvais serial
XXXX:00401BCB JZ 00445684
Et finalement:
Name/ Lucifer48
Serial/ -2143306300-LaZaRuS
Name/ Lucifer48/ID
Serial/ -1426085968-LaZaRuS
Mission successful sir !
Greetings: All ID members (Volatility, Torn@do, ...), Eternal Bliss, ACiD BuRN,
Duelist, LaZaRuS, people on #cracking4newbies, french crackers, and other crackme makers.
(c) Lucifer48. All rights reversed